package com.betterjr.modules.application.service;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.betterjr.common.utils.Collections3;
import com.betterjr.common.utils.DictUtils;
import com.betterjr.common.utils.UserUtils;
import com.betterjr.modules.application.data.ApplicationConstantCollections;
import com.betterjr.modules.application.data.ApplicationOperorgConstantCollections;
import com.betterjr.modules.application.data.ApplicationTypeConstantCollections;
import com.betterjr.modules.application.entity.ApplicationType;
import com.betterjr.modules.customer.service.CustMajorService;
import com.betterjr.modules.sys.entity.DictItemInfo;
import com.google.common.collect.Lists;

/**
 * 
 * @ClassName: ApplicationTypeService 
 * @Description: 应用类型服务
 * @author xuyp
 * @date 2017年11月17日 下午6:06:54 
 *
 */
@Service
public class ApplicationTypeService {

    @Autowired
    private ApplicationService applicationService;

    @Autowired
    private ApplicationOperorgService operorgService;

    @Autowired
    private ApplicationCustRoleService applicationCustRoleService;

    @Autowired
    private CustMajorService custMajorService;

    /**
     * 
     * @Title: queryApplicationTypeList 
     * @Description: 查询应用类型信息
     * @param anFlag  是否查询条数   0 不查询条数   1 查询当前应用类型下面的条数
     * @param anBusinStatus  查询的应用机构的状态 状态 1未生效 2已生效 9已失效
     * @return 查询应用类型信息
     * @throws 
     * @author xuyp
     * @date 2017年11月15日 上午10:26:43
     */
    public List<ApplicationType> queryApplicationTypeList(String anFlag, String anBusinStatus) {

        List<DictItemInfo> dictItemList = DictUtils
                .getDictList(ApplicationTypeConstantCollections.APPLICATION_TYPE_DICTINFO_CODE);

        if (!Collections3.isEmpty(dictItemList)) {

            List<ApplicationType> list = convertDictItemToApplicationType(dictItemList, anFlag, anBusinStatus);

            return list;

        }

        return Lists.newArrayList();

    }

    /**
     * 
     * @Title: convertDictItemToApplicationType 
     * @Description:将数据字典详细信息表转换成应用类型 
     * @param dictItemList
     * @param anFlag
     * @param anBusinStatus 查询的应用机构的状态 状态 1未生效 2已生效 9已失效(支持以,分割)
     * @return 将数据字典详细信息表转换成应用类型 
     * @throws 
     * @author xuyp
     * @date 2017年11月15日 上午10:36:14
     */
    private List<ApplicationType> convertDictItemToApplicationType(List<DictItemInfo> dictItemList, String anFlag,
            String anBusinStatus) {

        if (!Collections3.isEmpty(dictItemList)) {

            List<ApplicationType> typeList = new ArrayList<>(dictItemList.size());
            for (DictItemInfo item : dictItemList) {

                ApplicationType type = new ApplicationType();

                type.setDictItemName(item.getItemName());
                type.setDictItemValue(item.getItemValue());
                type.setDictCode(item.getItemCode());
                type.setDictItemId(Long.parseLong(item.getId() + ""));

                if (ApplicationTypeConstantCollections.APPLICATION_TYPE_FUNCTION_QUERYAPPLICATIONCOUNT.equals(anFlag)) {
                    // 查询当前应用分类下未删除的应用
                    /*List<ApplicationOperorg> applicationOperorgs = operorgService
                            .queryApplicationOperorgs(type.getDictItemId(), null, anBusinStatus);*/
                    type.setApplicationCount(queryApplicationsCount(type.getDictItemId(), anBusinStatus));
                }

                typeList.add(type);

            }

            return typeList;

        }

        return Lists.newArrayList();
    }

    /**
     * 
     * @Title: queryApplicationsCount 
     * @Description: 查询应用的数量
     * @param anApplicationTypeId
     * @param anBusinStatus
     * @return 查询应用的数量
     * @throws 
     * @author xuyp
     * @date 2017年11月21日 上午11:13:59
     */
    @SuppressWarnings("rawtypes")
    private int queryApplicationsCount(Long anApplicationTypeId, String anBusinStatus) {

        if (anApplicationTypeId != null) {
            if (StringUtils.isBlank(anBusinStatus)) {
                anBusinStatus = ApplicationOperorgConstantCollections.APPLICATIONOPERORG_BUSINSTATUS_CANUSED;
            }
            // 查询应用关系信息 （如果是admin角色从机构表中查询 如果不是从企业角色表中查询）
            List list = this.queryApplicationRelations(anApplicationTypeId, anBusinStatus);
            if (!Collections3.isEmpty(list)) {
                return list.size();
            }
        }

        return 0;

    }

    /**
     * 
     * @Title: queryApplicationRelations 
     * @Description: 根据当前用户从不同的表查询数据信息
     *      如果是管理员并且是平台 查询所有的应用
     *      如果是管理员 从应用机构表中查询数量
     *      最后从应用公司角色表中获取数量
     * @param anApplicationTypeId
     * @param anBusinStatus
     * @return 从不同表返回的数据集合
     * @throws 
     * @author xuyp
     * @date 2017年11月21日 下午2:49:50
     */
    @SuppressWarnings("rawtypes")
    public List queryApplicationRelations(Long anApplicationTypeId, String anBusinStatus) {

        // 得到角色名称 (管理员是：OPERATOR_ADMIN)
        String ruleList = UserUtils.getOperatorInfo().getRuleList();
        // 得到平台操作机构
        String operOrg = custMajorService.findPlatCustMajorDetail().getOperOrg();
        // 如果是管理员并且是平台 查询所有的应用
        if (ApplicationConstantCollections.APPLICATION_OPERATOR_ADMIN.equals(ruleList)
                && UserUtils.getOperatorInfo().getOperOrg().equals(operOrg)) {
            return applicationService.queryEffectiveApplicationsByApplicationType(anApplicationTypeId, null,
                    anBusinStatus);
        }

        // 如果是管理员 从应用机构表中查询数量
        if (ApplicationConstantCollections.APPLICATION_OPERATOR_ADMIN.equals(ruleList)) {
            return operorgService.queryApplicationOperorgs(anApplicationTypeId, null, anBusinStatus);
        }

        // 最后从应用公司角色表中获取数量

        return applicationCustRoleService.queryApplicationCustRoleCurrentUser(anApplicationTypeId, null, anBusinStatus);
    }

}
